iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 17
1
Modern Web

從前端走到設計,下一步?系列 第 17

Day17-開始串資料:電動機車充電站

  • 分享至 

  • xImage
  •  

第一次串資料

雖然先前接觸多次 1999 市政儀表板,但我第一次串開放資料用的不是 Open1999,而是高雄市電動機車充電站

前面有提到開放資料有很多是有問題的,因此在選的時候也需要過濾一些。這份資料看起來很完整,也用 JSON 格式。
大概長這樣:

[
    {
        "Kind": "公共充電站",
        "Charge": "免費",
        "Location": "新興區公所 ",
        "Address": " 高雄市新興區中正三路34號1樓(室內停車場)"
      },
      {
        "Kind": "公共充電站",
        "Charge": "免費",
        "Location": "高雄市民權停車場(機車停車場) ",
        "Address": " 高雄市新興區民權一路221號"
      },
      {
        "Kind": "公共充電站",
        "Charge": "投幣式",
        "Location": "三元機車行",
        "Address": "高雄市大寮區義和村鳳屏二路294號"
      },
      {
        "Kind": "公共充電站",
        "Charge": "免費",
        "Location": "億昌機車行 ",
        "Address": " 高雄市新興區文昌里16鄰和平一路269號"
      }  
] 

從 HTML 到 CSS,差別最大的就是要多新增一個檔案:all.js

這是我畫的非常草圖,畢竟這次目標不是設計而是套資料。
總之網頁要可以呈現所有的資料,也要可以篩選是投幣還是免費(搜尋我就沒做了,當時剛好遇到一些瓶頸)

第一步當然是接 JSON 資料

$.getJSON('你要的資料網址', function (資料陣列的名字,自己取) 
{
'裡面放要做的事情,例如你想要呈現的資料、按鈕按下去要幹嘛之類的'
}

如果你想做的事情是呈現每一筆資料:

data.forEach((x) => {
		document.getElementById('你要放資料的地方名稱,例如 content').innerHTML +=
        x.Charge+x.Location+x.Address;
	});


毫無疑慮的,順利呈現所有資料,但一點排版都沒有。因此在這個時候還是需要加上 HTML 標籤,幫助排版。由於每筆資料的排版都一是一樣的(充電收費、地點、地址),因此在增加 HTML 標籤的時候也只需要在 data forEach 裡面加,這樣就可以同時套用到每一筆資料

$.getJSON('https://data.kcg.gov.tw/dataset/a98754a3-3446-4c9a-abfc-58dc49f2158c/resource/48d4dfc4-a4b2-44a5-bdec-70f9558cd25d/download/yopendata1070622opendatajson-1070622.json', function (data) {
	//data is the JSON string
	data.forEach((x) => {
		document.getElementById('content_list').innerHTML +=
			'<div class="list">'
			+ '<div class="charge">' + x.Charge + '</div>'
			+ '<div class="location">' + x.Location + '</div>'
			+ '<div class="address">' + x.Address + '</div>'
			+ '</div>';
	});

加完的排版就整齊多了,也才是人類可讀的 XD

✔️呈現資料完成,接下來就是篩選了。這邊卡關滿久的,需要的邏輯比較多。
首先 checkbox 的狀態分為有勾跟沒勾,若設有勾 =true、沒勾 =false,那麼總共會有四種呈現方式

{
    [true, true],
    [true, false],
    [false, true],
    [false, false],
}

因此在寫程式的時候也需要寫四種可能發生的狀況。
首先要先讀取兩個 checkbox 裡的狀態

let checkState1 = document.getElementById("check1").checked;
let checkState2 = document.getElementById("check2").checked;

第一種是兩種都勾,會呈現全部,不需要做任何過濾,就跟前面一樣

接下來要做的是投幣勾、免費不勾
邏輯是:要先呈現全部後,清空免費的

else if{
document.getElementById('content_list').innerHTML = "";
			data.forEach((x) => {
				if (x.Charge === "免費") {
					document.getElementById('content_list').innerHTML +=
						'<div class="list">'
						+ '<div class="charge">' + x.Charge + '</div>'
						+ '<div class="location">' + x.Location + '</div>'
						+ '<div class="address">' + x.Address + '</div>'
						+ '</div>';
				}
})

依此類推,把變數改成投幣:要先呈現全部後,清空投幣的的。

而不呈現就更簡單了,innerHTML 裡什麼都不要放就好囉。

else if(checkState1 === false && checkState2 === false){
	document.getElementById('content_list').innerHTML = "";
}

嗯嗯,成功做完一頁可以篩選哪裡有免費充電站的網頁了,真棒。


上一篇
Day16-自產自銷:從自己的 DailyUI 開始
下一篇
Day18-九週的前端時光屋
系列文
從前端走到設計,下一步?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
sean666
iT邦新手 5 級 ‧ 2019-10-04 01:59:19

opendata 資料更新

$(function(){
    $.ajax({
        url: "https://api.kcg.gov.tw/Api/Service/Get/bf5d5f44-24e0-4177-93a2-3cd9539c082c",
        dataType: "json",
        success: show,
        error: function(){
            alert("error");
        }
    });
});
function show(data){
    console.log(data);
    console.log(data.data);
    let arryData = data.data
    arryData.forEach((x) => {
        document.getElementById('content_list').innerHTML +=
            '<tbody class="list">'
            + '<tr><th class="charge">' + x.計費方式 + '</th>'
            + '<th class="location">' + x.設置地點 + '</th>'
            + '<th class="address">' + x.設置地址 + '</th></tr>'
            +'</tbody>';
        });	
    }

我要留言

立即登入留言